home *** CD-ROM | disk | FTP | other *** search
/ Windows Game Programming for Dummies (2nd Edition) / WinGamProgFD.iso / pc / DirectX SDK / DXSDK / samples / Multimedia / Direct3D / Cull / readme.txt < prev    next >
Encoding:
Text File  |  2001-10-10  |  5.2 KB  |  114 lines

  1. //-----------------------------------------------------------------------------
  2. // Name: Cull Direct3D Sample
  3. // 
  4. // Copyright (c) 2000-2001 Microsoft Corporation. All rights reserved.
  5. //-----------------------------------------------------------------------------
  6.  
  7.  
  8. Description
  9. ===========
  10.    The Cull sample illustrates how to cull objects whose object bounding box 
  11.    (OBB) does not intersect the view frustum.  By not passing these objects
  12.    to D3D, you save the time that would be spent by D3D transforming and 
  13.    lighting these objects which will never be visible.  The time savings could 
  14.    be significant if there are many such objects, and/or if the objects contain 
  15.    many vertices.
  16.  
  17.    More elaborate and efficient culling can be done by creating hierarchies
  18.    of objects, with bounding boxes around groups of objects, so that not every 
  19.    object's OBB has to be compared to the view frustum.
  20.    
  21.    It is more efficient to do this OBB/frustum intersection calculation in your 
  22.    own code than to use D3D to transform the OBB and check the resulting clip 
  23.    flags.
  24.  
  25.    You can adapt the culling routines in this sample meet the needs of programs 
  26.    that you write.
  27.  
  28.  
  29. Path
  30. ====
  31.    Source:     DXSDK\Samples\Multimedia\D3D\Cull
  32.    Executable: DXSDK\Samples\Multimedia\D3D\Bin
  33.  
  34.  
  35. User's Guide
  36. ============
  37.    When you run this program, you'll see the same scene (a bunch of teapots)
  38.    rendered into two viewports.  The right viewport uses the view frustum that
  39.    the code will cull against.  The left viewport has an independent camera,
  40.    and shows the right viewport's frustum as a visible object, so you can see
  41.    where culling should be happening.  50 teapots are randomly placed in the
  42.    scene, and they are rendered along with their semitransparent OBB's.
  43.  
  44.    The teapots are colored as follows to indicate their cull status:
  45.  
  46.    Dark Green:    The object was quickly determined to be inside the frustum
  47.                   (CS_INSIDE)
  48.    Light Green:   The object was determined (after a fair bit of work) to be 
  49.                      inside the frustum (CS_INSIDE_SLOW)
  50.    Dark Red:      The object was quickly determined to be outside the frustum
  51.                   (CS_OUTSIDE)
  52.    Light Red:     The object was determined (after a fair bit of work) to be
  53.                      outside the frustum (CS_OUTSIDE_SLOW)
  54.    
  55.    You should only ever see green teapots in the right window.  Note that
  56.    most teapots are either dark green or dark red, indicating that the slower
  57.    tests are not needed for the majority of cases.
  58.  
  59.    To move the camera of the right viewport, click on the right side of the 
  60.    window, then use the camera keys listed below to move around.
  61.    
  62.    To move the camera of the left viewport, click on the left side of the 
  63.    window, then use the camera keys listed below to move around.
  64.  
  65.    You can also rotate the teapots to set up particular relationships against
  66.    the view frustum.  You cannot move the teapots, but you can get the same 
  67.    effect by moving the frustum instead.
  68.  
  69.    The following keys are implemented. The dropdown menus can be used for the
  70.    same controls.
  71.       <F1>               Shows help or available commands.
  72.       <F2>               Prompts user to select a new rendering device or 
  73.                             display mode
  74.       <Alt+Enter>        Toggles between fullscreen and windowed modes
  75.       <Esc>              Exits the app.
  76.       <W, S, Arrow Keys> Move the camera
  77.       <Q, E, A, Z>       Rotate the camera
  78.       <Y, U, H, J>       Rotate the teapots
  79.       <N>                Snap the left camera to match the right camera
  80.       <M>                Snap the right camera to the original position
  81.  
  82. Programming Notes
  83. =================
  84.    The OBB/viewport intersection algorithm used by this program is:
  85.    1) If any OBB corner pt is inside the frustum, return CS_INSIDE
  86.    2) Else if all OBB corner pts are outside a single frustum plane, 
  87.       return CS_OUTSIDE
  88.    3) Else if any frustum edge penetrates a face of the OBB, return 
  89.       CS_INSIDE_SLOW
  90.    4) Else if any OBB edge penetrates a face of the frustum, return
  91.       CS_INSIDE_SLOW
  92.    5) Else if any point in the frustum is outside any plane of the 
  93.       OBB, return CS_OUTSIDE_SLOW
  94.    6) Else return CS_INSIDE_SLOW
  95.  
  96.    The distinction between INSIDE and INSIDE_SLOW, and between OUTSIDE and 
  97.    OUTSIDE_SLOW, is only provided here for educational purposes.  In a
  98.    shipping app, you probably would combine the cullstates into just 
  99.    INSIDE and OUTSIDE, since all you usually need to know is whether the OBB 
  100.    is inside or outside the frustum.
  101.  
  102.    The culling code shown here is written in a straightforward way for 
  103.    readability.  It is not optimized for performance.  Additional optimizations
  104.    can be made, especially if the bounding box is a regular box (e.g., the front
  105.    and back faces are parallel).  Or this algorithm could be generalized to work
  106.    for arbitrary convex bounding hulls to allow tighter fitting against the 
  107.    underlying models.
  108.  
  109.    This sample makes use of common DirectX code (consisting of helper functions,
  110.    etc.) that is shared with other samples on the DirectX SDK. All common
  111.    headers and source code can be found in the following directory:
  112.       DXSDK\Samples\Multimedia\Common
  113.  
  114.